package com.webserver.core;

import com.webserver.controller.UserController;
import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.File;
import java.net.URISyntaxException;

/***
 * 该类是MVC框架提供的类，用于接手Tomcat处理交互
 * 处理请求环节的工作第五十六步
 */
public class DispatcherServlet {
    /**
     * 改成单例模式为了不每次都new一个新对象第五十九步
     */
    private static DispatcherServlet instance = new DispatcherServlet();
    private DispatcherServlet() {
    }
    public static DispatcherServlet getInstance(){
        return instance;
    }

    /**
     * 为了不每次都重新找路径定成两个静态属性
     *然后初始化 第五十八步
     */
    private static File root;
    private static File staticDir;
    static {
        try {
            root = new File(DispatcherServlet.class.getClassLoader().getResource(".").toURI()
            );
            staticDir = new File(root,"static");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }

    /**
     * 第五十七步 给处理请求的代码从ClientHandler拿出来封装成方法
     * @param request
     * @param response
     */
    public void service(HttpServletRequest request , HttpServletResponse response){
        //第三十步定位类加载路径
        //String path = request.getUri();

        /*
        这里不能在使用uri作为判断路径 因为uri可能含有参数
        而参数不是固定不变的内容，无法参与确定值得判断
         */
        String path = request.getRequestURI();

        //第六十六步当前请求路径是否为一个业务
        if ("/regUser".equals(path)){
            UserController controller = new UserController();
            controller.reg(request,response);


        }else {
            //static路径根据类加载路径找到的
            //根据static找到index (改成根据抽象路径（path）找到地址)
            File file = new File(staticDir, path);
            //定义一个变量用来接收是否是个文件返回的输出语句
            //  String statusLine;
            //第三十九步判断是否是个文件 如果是文件就读取否则返回404
            if (file.isFile()) {
                //存在
//                statusLine = "HTTP/1.1 200 OK";
                //发送响应头第六十三步

                //第五十一步将发送的状态行改造成方法外面文件设置到这个属性上
                response.setContentFile(file);
            } else {
                //不存在
                //五十二步如果不存在改成404
                response.setStatusCode(404);
                response.setStatusReason("NotFound");
                //回给它一个404页面
                file = new File(staticDir, "404.html");

                response.setContentFile(file);
                //statusLine = "HTTP/1.1 404 NotFound";

            }
        }
            response.addHeader("Server", "BirdWebServer");

    }
}
